package com.kyl.base;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * 实体基础类，用于为其他实体类提供通用的属性和功能。
 * 该类包含了常见的数据库实体所需的基本字段，如主键、创建时间、更新时间、创建人、更新人等信息。
 * 同时，还提供了一个用于存储请求参数的属性。
 *
 */
@Data
@NoArgsConstructor
public class BaseEntity implements Serializable {
    // 标记该类可以被序列化，以便在网络传输或持久化存储时能够正确处理对象状态

    /**
     * 主键
     * 唯一标识数据库表中的每一条记录。在大多数情况下，它是一个自增长的数字，用于确保数据的唯一性和完整性。
     */
    @ApiModelProperty(value = "主键")
    public Long id;

    /**
     * 创建时间
     * 记录该实体在数据库中首次被创建的时间。使用Java 8的LocalDateTime类来表示日期和时间，精确到纳秒级别。
     */
    @ApiModelProperty(value = "创建时间")
    public LocalDateTime createTime;

    /**
     * 更新时间
     * 记录该实体在数据库中最后一次被更新的时间。每次实体的属性发生变化并保存到数据库时，该时间会被更新。
     */
    @ApiModelProperty(value = "更新时间")
    public LocalDateTime updateTime;

    /**
     * 创建人
     * 记录创建该实体的用户的唯一标识。通常是一个用户ID，用于跟踪数据的创建来源。
     */
    @ApiModelProperty(value = "创建人")
    private Long createBy;

    /**
     * 更新人
     * 记录最后一次更新该实体的用户的唯一标识。用于追踪数据的更新操作由谁发起。
     */
    @ApiModelProperty(value = "更新人")
    private Long updateBy;

    /**
     * 备注
     * 一个字符串字段，用于存储关于该实体的额外信息或注释。可以包含一些描述性的文本，帮助用户更好地理解实体的内容。
     */
    @ApiModelProperty(value = "备注")
    private String remark;

    /**
     * 创建人
     * 记录创建该实体的用户的名称。与`createBy`不同，这里存储的是用户的可读名称，方便在展示界面中使用。
     */
    @ApiModelProperty(value = "创建人")
    private String creator;

    /**
     * 更新人
     * 记录最后一次更新该实体的用户的名称。与`updateBy`不同，这里存储的是用户的可读名称，方便在展示界面中使用。
     */
    @ApiModelProperty(value = "更新人")
    private String updater;

    /**
     * 构造函数，用于创建一个带有指定主键的BaseEntity实例。
     *
     * @param id 要设置的主键值。
     */
    public BaseEntity(Long id) {
        this.id = id;
    }

    /**
     * 请求参数 (JsonIgnore is used to exclude it from Swagger docs)
     * 一个用于存储请求参数的Map。在实际应用中，这个属性可以用来存储一些临时的、与请求相关的参数，
     * 这些参数可能不会直接对应到数据库表的字段。
     * `@JsonIgnore`注解用于指示Jackson库在序列化和反序列化过程中忽略该属性，
     * 同时`@ApiModelProperty`注解用于在Swagger文档中排除该属性，使其不会在API文档中显示。
     */
    @JsonIgnore
    @ApiModelProperty(value = "请求参数")
    private Map<String, Object> params;

    /**
     * 获取请求参数的方法。
     * 如果`params`属性为`null`，则会创建一个新的`HashMap`实例。
     *
     * @return 存储请求参数的`Map`对象。
     */
    public Map<String, Object> getParams() {
        if (params == null) {
            params = new HashMap<>();
        }
        return params;
    }
}